﻿#include "personcontroller.h"
#include "QTableWidget"
#include "QFile"
#include "QDebug"
#pragma execution_character_set("utf-8")

PersonController::PersonController()
{

}

/*
 * @author  : Zeeland
 * @describe: 该函数输入人名时，用于判断在两个文件搜索是否存在这个人，依次打开这两个文件，遍历每一行去搜索，如果存在这个人的信息则放入一个集合中，返回一个二维集合
 *            如果不存在这个人，则在集合中不存在任何元素，查找的时候只要判断返回的集合是否返回空指针就能知道是否搜索到这个人；
 * @param   : QString name
 * @return  : QList<QList<QString>>
 */
QList<QList<QString>> PersonController::search(QString name)
{
    //qDebug()<<"searching,the name is "+name;
    //创建一个list集合
    QList<QList<QString>> info;

    //需要搜索两个文件，因此两个文件依次搜索
    QFile file;
    file.setFileName("./Data/phoneData.txt");//先检测文件phoneData.txt
    if(file.open(QIODevice::ReadWrite))
    {
        while(!file.atEnd())//将文件中每行数据都读出来
        {
            QByteArray line = file.readLine();//读取每一行
            QString str(line);
            QList<QString> currentList = str.split(',');
            currentList.push_back("手机");//标志位，0表示手机数据，1表示电话卡数据
            //判断名字是否相等，如果相等，则将该人所有信息放入一个QList节点中
            if(currentList[0].contains(name))
            {
                info.push_back(currentList);
                //qDebug()<<currentList[0]+" is the samed as !!!!!";
            }
        }
    //printQList(info);
    file.close();
    }
    file.setFileName("./Data/simData.txt");//先检测文件phoneData.txt
    if(file.open(QIODevice::ReadWrite))
    {
        while(!file.atEnd())//将文件中每行数据都读出来
        {
            QByteArray line = file.readLine();//读取每一行
            QString str(line);
            QList<QString> currentList = str.split(',');
            currentList.push_back("Sim卡");
            //判断名字是否相等，如果相等，则将该人所有信息放入一个QList节点中
            if(currentList[0].contains(name))
            {
                info.push_back(currentList);
                //qDebug()<<currentList[0]+" is the samed as !!!!!";
            }
        }
    //printQList(info);
    file.close();
    }
    return info;
}


/*
 * @author  : Zeeland
 * @describe: 该函数用于判断通讯录中的某个空间是否包含相同的元素
 *            如果该函数返回一个空list，则表明不存在相同元素的人
 *            反之，则存在相同元素的人，返回的数据可以用于用户交互
 *            其中element为某个人的一个特定的信息，比如电话号码
 *            eleIndex为该特定信息在QList<QString> list中的下标，
 *            两个存在一一对应的关系，eg:list[0]为姓名,list[1]为电话号码,
 *            如果element为电话号码，则eleIndex固定为1
 *            QString<QList> list的关系对照表如下(全局都是如此)
 *            ['姓名','电话号码','籍贯','生日','邮编','公司']
 * @param   : QString element,int pageIndex(当前数据的页面),int EleIndex(元素的下标)
 * @return  : QList<QString> rlist
 */
QList<QString> PersonController::hasEqualsElement(QString element, int eleIndex,int pageIndex)
{
    QList<QString> rList;//该list为最终返回的list
    QFile file;
    //选择需要检测的文件
    pageIndex==0?file.setFileName("./Data/phoneData.txt"):file.setFileName("./Data/simData.txt");
    QString displayString;
    if(!file.open(QIODevice::ReadOnly)){
        qDebug()<<"open failed";
        return rList;
    }
    else
    {
        while(!file.atEnd())//逐行读数据
        {
            QByteArray line = file.readLine();
            QString str(line);
            QStringList midList = str.split(',');//midList中间变量
            if(midList[eleIndex]==element)
            {
                rList=midList;
                return rList;
            }
        }
    }
    file.close();
    return rList;
}

/*
 * @author  : Zeeland
 * @describe: 此为上述函数的重载函数，只是传入的参数不同，功能相同
 *            该函数用于判断通讯录中的某个空间是否包含相同的元素
 *            如果该函数返回一个空list，则表明不存在相同元素的人
 *            反之，则存在相同元素的人，返回的数据可以用于用户交互
 *            其中QList<QString>中保存的信息为某一个联系人的所有信息
 *            其中list[0]为姓名,list[1]为电话号码
 * @param   : QList<QString> list,int pageIndex(当前数据的页面),int EleIndex(元素的下标)
 * @return  : QList<QString>
 */
QList<QString> PersonController::hasEqualsElement(QList<QString> list ,int eleIndex,int pageIndex)
{
    QList<QString> rList;//该list为最终返回的list
    QFile file;
    //选择需要检测的文件
    pageIndex==0?file.setFileName("./Data/phoneData.txt"):file.setFileName("./Data/simData.txt");
    QString displayString;
    if(!file.open(QIODevice::ReadOnly)){
        qDebug()<<"open failed";
        return rList;
    }
    else
    {
        while(!file.atEnd())//逐行读数据
        {
            QByteArray line = file.readLine();
            QString str(line);
            QStringList midList = str.split(',');//midList中间变量
            if(midList[eleIndex]==list[eleIndex])
            {
                rList=list;
                return rList;
            }
        }
    }
    file.close();
    return rList;
}



/*
 * @author  : Zeeland
 * @describe: 该函数用于添加联系人
 * @param   : QString number,int index(当前数据的页面)
 * @return  : bool
 */
bool PersonController::addPerson(QList<QString> list,int index)
{
    QFile file;
    if(index ==0)
    {
       file.setFileName("./Data/phoneData.txt");
    }
    else
    {
       file.setFileName("./Data/simData.txt");
    }
    QString displayString="";
    for(int i=0;i<5;i++)
    {
        displayString+=list[i]+",";//字符串拼接
    }
    displayString+=list[5];
    if(!file.open(QIODevice::Append)){
        qDebug()<<"open failed";
        return 0;
    }else{
        file.write("\n");
        file.write(displayString.toUtf8());
        file.close();
        return 1;
    }

}

/*
 * @author  : Zeeland
 * @describe: 该函数用户删除两个空间中所有名字与其相同的人
 *            搜索两个空间，只要查找到名字相符的人就将其删除
 *            即只要有删除操作执行了该函数就会返回true,如果没有执行成功则返回false
 *            理论下在逻辑范围内不可能返回false
 * @param   : QList<QString> list
 * @return  : null
 */
bool PersonController::deletePerson(QString name)
{
    return PersonController::deletePersonJudge(0,name)||PersonController::deletePersonJudge(1,name)?1:0;
}

/*
 * @author  : Zeeland
 * @describe: 该函数用于删除一个空间内的该联系人
 *            如果该空间内存在该联系人则将其删除，返回true
 * @param   : QList<QString> list
 * @return  : null
 */
bool PersonController::deletePersonJudge(int index,QString name)
{
    qDebug()<<"------------------deletePersonJudge method start----------------------";
    //需要搜索两个文件，因此两个文件依次搜索
    QFile file;
    QString fileName;
    bool hasSamePerson =false;
    file.setFileName(index==0?"./Data/phoneData.txt":"./Data/simData.txt");
    if(file.open(QIODevice::ReadWrite))
    {
        fileName = file.fileName();
        int currentRow=0;
        while(!file.atEnd())//将文件中每行数据都读出来
        {
            QByteArray line = file.readLine();//读取每一行
            QString str(line);
            QList<QString> currentList = str.split(',');
            //判断名字是否相等，如果相等，则将该人所有信息删除
            if(currentList[0]==name)
            {
                qDebug()<<"the same person:"<<currentList[0];
                //printQList(currentList);
                PersonController::writeFinalInFile(currentRow,fileName);
                hasSamePerson =true;
            }
            currentRow++;

        }
    file.close();
    }
    qDebug()<<"------------------deletePersonJudge method end----------------------";
    return hasSamePerson;
}

/*
 * @author  : Zeeland
 * @describe: 该函数用处编辑联系人的信息
 *            如果该空间内存在该联系人则将其删除，返回true
 * @param   : QList<QString> list
 * @return  : null
 */
bool PersonController::editPerson(QList<QString> list)
{
    return PersonController::editPersonJudge(0,list)||PersonController::editPersonJudge(1,list)?1:0;
}
bool PersonController::editPersonJudge(int index,QList<QString> list)
{
    return 0;
}


//如果是5行，nNum最大为4,nNum为行数
void PersonController::DeleteOneline(int nNum, QString &strall)
{
    int nLine=0;
    int Index=0;
    //通过'\n'算出行数nLine
    while(Index!=-1)
    {
        Index=strall.indexOf('\n',Index+1);//return -1 if str is not found
        nLine++;
    }
    //如果是直接从位置0开始删除\n算一个字符"abc\nme\ndo" \n的index是3要删除3+1个字符，即index+1个
    if(nNum==0)
    {
        int nIndex=strall.indexOf('\n');
        strall.remove(0,nIndex+1);
    }
    else
    {
        int nTemp=nNum;
        int nIndex=0,nIndex2=0;
        while(nTemp--)
        {
            //
            nIndex=strall.indexOf('\n',nIndex+1);//这里会更新nIndex
            if(nIndex!=-1)//说明是有效的
            {
                nIndex2=strall.indexOf('\n',nIndex+1);
            }
        }
        //删除的行不是最后一行（从nIndex+1这个位置起nIndex2-nIndex个字符全部抹去）
        if(nNum<nLine-1)
        {
            strall.remove(nIndex+1, nIndex2-nIndex);//不用减一
        }
        //删除的是最后一行（从nIndex起始len-nIndex个字符全抹去）
        //不能从nIndex+1处开始，
        else if(nNum==nLine-1)
        {
            int len=strall.length();
            strall.remove(nIndex,len-nIndex);
        }
    }
}

void PersonController::editOneLine(int nNum,QString &strall)
{
    int nLine=0;
    int Index=0;
    //通过'\n'算出行数nLine
    while(Index!=-1)
    {
        Index=strall.indexOf('\n',Index+1);//return -1 if str is not found
        nLine++;
    }
    //如果是直接从位置0开始删除\n算一个字符"abc\nme\ndo" \n的index是3要删除3+1个字符，即index+1个
    if(nNum==0)
    {
        int nIndex=strall.indexOf('\n');
        strall.remove(0,nIndex+1);
    }
    else
    {
        int nTemp=nNum;
        int nIndex=0,nIndex2=0;
        while(nTemp--)
        {
            //
            nIndex=strall.indexOf('\n',nIndex+1);//这里会更新nIndex
            if(nIndex!=-1)//说明是有效的
            {
                nIndex2=strall.indexOf('\n',nIndex+1);
            }
        }
        //删除的行不是最后一行（从nIndex+1这个位置起nIndex2-nIndex个字符全部抹去）
        if(nNum<nLine-1)
        {
            strall.remove(nIndex+1, nIndex2-nIndex);//不用减一
        }
        //删除的是最后一行（从nIndex起始len-nIndex个字符全抹去）
        //不能从nIndex+1处开始，
        else if(nNum==nLine-1)
        {
            int len=strall.length();
            strall.remove(nIndex,len-nIndex);
        }
    }
}



/*
 * @author  : Zeeland
 * @describe: 该函数用于删除文件中的一行内容，输入行号和文件名完成调用
 * @param   : QList<QString> list
 * @return  : null
 */
void PersonController::writeFinalInFile(int nNumLine, QString &filename)
{
    QString strall;
    QFile readfile(filename);
    if(readfile.open(QIODevice::ReadOnly))
    {
        QTextStream stream(&readfile);
        stream.setCodec("UTF-8");
        strall=stream.readAll();
        qDebug()<<"------front text here---------";
        qDebug()<<strall;
    }
    readfile.close();
    DeleteOneline(nNumLine, strall);

    qDebug()<<"------after text here---------";
    qDebug()<<strall;

    QFile writefile(filename);
    if(writefile.open(QIODevice::WriteOnly))
    {
        QTextStream wrtstream(&writefile);
        wrtstream.setCodec("UTF-8");
        wrtstream<<strall;
    }
    writefile.close();
}






/*
 * @author  : Zeeland
 * @describe: 该函数用于打印调试信息,传入一行数据的集合，就会将数据打印到调试窗口
 *            打印出来的信息如："杨兰英 18143228642 杭州市 2006-11-01 613880 毕博诚信息有限公司\r\n "
 * @param   : QList<QString> list
 * @return  : null
 */
void PersonController::printQList(QList<QString> list)
{
    QString displayString;
    for(int col=0;col<6;col++)
    {
        displayString+=list[col]+" ";
    }
    qDebug()<<displayString;

}

/*
 * @author  : Zeeland
 * @describe: 该函数用于打印调试信息,传入多行数据的集合，就会将多行信息都打印在调试窗口上
 *            打印出来的信息如："杨兰英 18143228642 杭州市 2006-11-01 613880 毕博诚信息有限公司\r\n "
 * @param   : QList<QString> list
 * @return  : null
 */
void PersonController::printQList(QList<QList<QString>> list)
{
    qDebug()<<"-----------print information start------------";
    for(int i=0;i<list.size();i++)
    {
        QString displayString;
        for(int j=0;j<6;j++)
        {
            displayString+=list[i][j]+" ";
        }
        qDebug()<<displayString;
    }
    qDebug()<<"-----------print information end------------";

}

void PersonController::getPhoneNum()
{

}

void PersonController::getSimNum()
{

}

